#include "variable.h"

Variable::Variable(Variable *sig,int fila,int col):TipoDato(fila,col)
{
    this->sig = sig;
}

void Variable::setSig(Variable *sig)
{
    this->sig = sig;
}

Variable *Variable::getsig()
{
    return this->sig;
}

string Variable::is()
{
    return "Literal_Identificador";
}

void Variable::setValor(string valor)
{
    this->valor = valor;
}

string Variable::getValor()
{
    return this->valor;
}

Tipo_ts *Variable::validarSemantica(Tabla_Simbolos *tabla_de_tipo, Tabla_Simbolos *tabla_de_varaible)
{
    Item_ts *its = tabla_de_varaible->get(this->valor);
            if(its==0){
                its = tabla_de_varaible->get(this->valor.append("&FP&"));
            }
            if(its!=0){
                if(its->getTipo()->is().compare("REGISTRO")==0){
                    if(this->getsig()!=0){

                        Registro *reg = (Registro*)its->getTipo();
                        return this->getsig()->validarSemantica(tabla_de_tipo,reg->getTs());

                        }else{
                            return its->getTipo();
                        }
                    }else{
                    if(this->getsig()!=0){
                        stringstream out;
                        out<<"Se esperaba un Registro en el lado Izquierdo// Fila:"<<this->getFila()<<endl;
                        throw exception(out.str().c_str());
                    }else{
                    return its->getTipo();
                    }
                }


            }else{
                stringstream out;
                out<<"Variable No exite "<<this->getValor()<<endl;
                throw exception(out.str().c_str());

            }
}

Codigo_Lugar Variable::generarCodigo(GenerarVariable* var,Tabla_Simbolos *tabla_de_tipo,Tabla_Simbolos *tabla_de_varaible)
{
    Codigo_Lugar cl;
    cl.codigo = "_"+this->getValor()+"_";
    Item_ts *its = tabla_de_varaible->get(this->valor);
    if(its->getTipo()->is().compare("REGISTRO")==0){
        cl.codigo+=".";
        Registro *registro = (Registro*)its->getTipo();
        cl.codigo+=this->getsig()->generarCodigo(var,tabla_de_tipo,registro->getTs()).codigo;
    }


    return cl;
}
